//引入toast提示
import {
	toast,
	logs
} from '../common/func';
import apis from './config'

function request(config) {
	return new Promise((resolve, reject) => {
		//在这里可以对请求前进行操作
		try {

			//token配置

			const token = uni.getStorageSync('token');

			config.header['Authorization'] = `JWT ${token}`;

			//延迟设置

			config.timeout = 30 * 1000;
			//拼接url
			config.url = apis.baseURL + config.url;

			//开始请求
			uni.request({
				...config,
				success: res => {
					switch (res.statusCode) {
						//成功请求
						case 200:
							if (res.data.errno == 0) {
								// res为服务端返回值，可能有code，result等字段
								// 这里对res进行返回，将会在this.$apis.apiName(data).then(res => {})的then回调中获取
								resolve(res.data)
							} else if (res.data.errno == 1999) {
								// 假设返回数据中含有后端返回的错误信息
								//这里即可进行错误处理
								toast(res.data.error)
								logs(res.data.error, 2)
								reject(res.data)
							} else if (res.data.errno == 1006) {
								for (let i in res.data.validationErrors) {
									toast(res.data.validationErrors[i])
									reject(res.data.validationErrors[i])
								}
							} else if (res.data.errno == 1002) {
								if (!token) return;
								uni.showModal({
									content: "登录失效请重新登陆",
									showCancel: false,
									title: "注意",
									success: () => {
										uni.clearStorage()
										uni.reLaunch({
											url: "/pages/login/index"
										})
									}
								})
							} else {
								toast('接口数据错误')
								logs('接口数据错误', 2)
								reject(res)
							}

							break;
						case 400:
							toast('错误请求');
							logs('错误请求', 3);
							reject(res.statusCode)
							break;
						case 401:
							toast('未授权，请重新登录');
							logs('未授权，请重新登录', 3);
							reject(res.statusCode)
							setTimeout(() => {
								uni.reLaunch({
									url: "/pages/index/login"
								})
							}, 1000)
							break;
						case 403:
							toast('拒绝访问');
							logs('拒绝访问', 3);
							reject(res.statusCode)

							break;
						case 404:
							toast('请求错误,未找到该资源');
							logs('请求错误,未找到该资源', 3);
							reject(res.statusCode)
							break;
						case 405:
							toast('请求方法未允许');
							logs('请求方法未允许', 3);
							reject(res.statusCode)
							break;
						case 408:
							toast('请求超时');
							logs('请求超时', 3);
							reject(res.statusCode)
							break;
						case 500:
							toast('服务器端出错');
							logs('服务器端出错', 2);
							reject(res.statusCode)
							break;
						case 501:
							toast('网络未实现');
							logs('网络未实现', 2);
							reject(res.statusCode)

							break;
						case 502:
							toast('网络错误');
							logs('网络错误', 2);
							reject(res.statusCode)

							break;
						case 503:
							toast('服务不可用');
							logs('服务不可用', 2);
							reject(res.statusCode)
							break;
						case 504:
							toast('网络超时');
							logs('网络超时', 2);
							reject(res.statusCode)
							break;
						case 505:
							toast('http版本不支持该请求');
							logs('http版本不支持该请求', 3);
							reject(res.statusCode)
							break;
						default:
							toast('连接错误');
							logs(res, 3);
							reject(res.statusCode)
					}
				},
				fail: err => reject(new Error(`请求失败：${err.errMsg}`))
			})
		} catch (err) {
			console.log('请求失败', err)
		}
	})

}
export default request
